package vista;



import grafica.DisegnaListaGiocatori;
import grafica.DisegnaListaGiocatori1;
import grafica.Forma;
import grafica.FormaComposita;
import grafica.Grafica;
import grafica.ListaOstacoli;
import grafica.base.CerchioBase;
import grafica.base.LineaBase;
import grafica.base.RettangoloBase;
import grafica.vista.CerchioVista;
import grafica.vista.DartVista;
import grafica.vista.LineaVista;
import grafica.vista.RettangoloVista;


import java.awt.Color;
import java.awt.Graphics;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JPanel;

import controllo.MuoviControllore;
import controllo.SparaControllore;

import modulo.Dardo;
import modulo.Giocatore;
import modulo.InfoGioco;
import modulo.ListaGiocatori;
import modulo.ProxyListaGiocatori;

public class Campo extends JPanel implements Observer {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private InfoGioco infogioco;
	private Grafica grafica;
	private ListaOstacoli lista;
	public static  Dardo SlowDardo=new Dardo(10,5,200);
	public static Dardo FastDardo=new Dardo( 20,10,400);
	public static FormaComposita Muro=new FormaComposita();
	public static FormaComposita Lago=new FormaComposita();
	public static FormaComposita Casa=new FormaComposita();
	public Campo(InfoGioco infogioco,Grafica TipoGrafica,AlertDialog alert) {
		this.infogioco = infogioco;
		this.grafica=TipoGrafica;
		this.DefinisciOstacoli();
		
		Giocatore[] giocatori = infogioco.getLista().getElencoGiocatori();
		infogioco.getLista().getGiocatorePrincipale().addObserver(this);
		ProxyListaGiocatori proxy=new ProxyListaGiocatori(infogioco.getLista());
		 this.lista = new ListaOstacoli();
		 grafica.GeneraOstacoli(lista);
	//	giocatori[0].getDardo().addObserver(this);
		MuoviControllore controlloremovimento = new MuoviControllore(
				lista,proxy,alert);
		SparaControllore controllosparo = new SparaControllore(proxy,alert);
		controllosparo.AggiungiOsservatore(this);
		setFocusable(true);
		addKeyListener(controlloremovimento);
		addMouseListener(controllosparo);
		addKeyListener(controllosparo);
		 addMouseMotionListener(controllosparo);
	
	
		}
	public void DefinisciOstacoli(){
		/*Muro*/
		Forma v[]=new Forma[1];
		v[0]=new RettangoloVista(new RettangoloBase(300, 200,100, 100));
		Muro.setElencoForme(v);
		/*Lago*/
		Forma v1[]={new CerchioVista(new CerchioBase(300, 400, 40)),
				   new CerchioVista(new CerchioBase(320, 420, 50))};
		Lago.setElencoForme(v1);
		/*Casa*/
		int x=450;
		int y=500;
		int larghezza=50;
		RettangoloVista vista=new RettangoloVista(new RettangoloBase(x, y,larghezza,larghezza));
		vista.setColore(Color.RED);
		vista.setRiempimento(true);
		LineaVista a=new LineaVista(new LineaBase(x, y, x+larghezza, y+larghezza));
		LineaVista b=new LineaVista(new LineaBase(x+larghezza,y,x,y+larghezza));
		Forma v2[]=new Forma[3];
		v2[0]=vista;
		v2[1]=a;
		v2[2]=b;
		Casa.setElencoForme(v2);
		
	}
	
	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		infogioco.getLista().setMode(infogioco.getModalitaAttiva());
		infogioco.getLista().setGrafica(grafica);
		DisegnaListaGiocatori disegna=new DisegnaListaGiocatori1(infogioco.getLista());
		disegna.draw(g);
		lista.draw(g);
		DartVista vi=grafica.getTipoVistaDardo();
		vi.setDardo(infogioco.getLista().getGiocatorePrincipale().getDardo());
		if(vi.getDardo().getXf()!=vi.getDardo().getXi()&&vi.getDardo().getYi()!=vi.getDardo().getYf()){
			vi.draw(g);
		}
	}

	@Override
	public void update(Observable arg0, Object arg1) {
		repaint();
	}

}
